#include <iostream>
 
// RAII : Resource access is initialized 资源获取即初始化
// 资源的获取和释放 和 对象的生命周期 绑定

// 浅拷贝问题 : 类的成员中有指针变量采用RAII机制，但是在拷贝时只是拷贝了指针的值，导致两个指针指向同一个堆上空间
// 释放时导致了二次释放

// 深度拷贝 : 不能简单的拷贝指针成员，而是复制堆上空间
class Test
{
public:
    // 类内留下声明
    Test();
    Test::Test(int a);
    Test(const Test &t);
    Test copy();
    void operator=(const Test &t);
    void SetValue(int n);
    void Print();
    ~Test();
private:
    int *a;
};

//this指针 : 每个类都会带的,指向当前的对象的一个指针
Test::Test()
{
    printf("this : %p\n",this);
    this->a = new int;
}
//用this去区分形参变量和成员变量
Test::Test(int a)
{
    this->a = new int;
    *this->a = a;
}
Test::Test(const Test &t)
{
    a = new int;
    *a = *t.a;
}
Test Test::copy()
{
    return *this; // *this : 当前对象
}
void Test::operator=(const Test &t)
{
    *a = *t.a;
}
void Test::SetValue(int n)
{
    *a = n;
}
void Test::Print()
{
    std::cout << *a << std::endl;
}
Test::~Test()
{
    delete a;
}
int main()
{
    Test t;
    // printf("%p\n",&t);
    // t.SetValue(10);
    // t.Print();
    // Test t1 = t; // Test t1(t);
    // Test t1;
    // t1 = t; // 赋值运算符重载也有二次释放问题
    
    return 0;
}


